$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Tip podataka - char

U lekciji "Stringovi 1" posmatrali smo niske (niz) karaktera, no postoji i tip podataka koji predstavlja pojedinačne karaktere i zove se char. Za dodelu vrednosti promenljivoj tipa char koriste se jednostruki znaci navoda.

char karakter = 'e' ;

Obrati pažnju da se kod stringova koriste dvostruki znaci navoda.

string mojString = "tekst";
cout << "Ovo je primer gde se koriste dvostruki znaci navoda.";

Ukoliko pokušaš da u programu napišeš jednostruke znake navoda umesto dvostrukih kod dodele vrednosti stringu, kao u sledećem primeru, dobićeš grešku.

string mojString = 'tekst';

Pristup pojedinačnom karakteru stringa

Stringovi su nizovi karaktera, međutim stringovi su dosta specifični i neki programski jezici ih posmatraju kao posebne tipove. Svakom elementu stringa možemo pristupiti kao što pristupamo elementu bilo kog niza. Naravno, moguće je menjati elemente stringa kao uobičajeno menjanje elemenata niza, prvi karakter stringa nalazi se na poziciji 0.

U sledećoj tabeli prikazan je jedan string sa pozicijama svakog karaktera stringa:

012345678910111213
Babblebeekurs

Pogledajmo sledeći primer:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s = "Babblebee kurs omogucava studentima da unaprede "
               "svoje znanje iz programiranja";
    cout << s << endl;

    s[1] = 'u';
    cout << s << endl;

    for(int i = 0; i < s.length(); i++)
    {
        cout<< s[i];
    }

    cout<< endl;

    return 0;
}

Standardni izlaz posle pokretanja navedenog programa izgleda ovako:

Babblebee kurs omogucava studentima da unaprede svoje znanje iz programiranja
Bubblebee kurs omogucava studentima da unaprede svoje znanje iz programiranja
Bubblebee kurs omogucava studentima da unaprede svoje znanje iz programiranja

Obrati pažnju da pošto je s string tj. niz karaktera, da je s[1] zapravo tipa char i da zato u sledećoj liniji programa koristimo jednostruke znake navoda.

s[1] = 'u';

Reklama za Cipiripi u kojoj se svaki samoglasnik menja u "i", je poslužila kao ideja za sledeću aplikaciju.

| Cipiripi | |:-: | https://www.youtube.com/watch?v=JWorYHJiWnQ

Sledeći programski kod menja svaki samoglasnik u "i" u jednoj rečenici.

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s = "Bubblebee kurs omogucava studentima da unaprede "
               "svoje znanje iz programiranja";
    cout << s << endl;

    for(int i = 0; i < s.length(); i++)
    {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'o' || s[i] == 'u')
        {
            s[i] = 'i'; 
        }
        else if (s[i] == 'A' || s[i] == 'E' || s[i] == 'O' || s[i] == 'U')
        {
            s[i] = 'I';
        }
    }
    
    cout << s << endl;  
    
    return 0;
}

Standardni izlaz posle pokretanja navedenog programa izgleda ovako:

Bubblebee kurs omogucava studentima da unaprede svoje znanje iz programiranja    
Bibblibii kirs imigicivi stidintimi di inipridi sviji zninji iz prigrimirinji

U biblioteci string se nalaze korisne funkcije za rad sa stringovima u jeziku C++. Ovde ćemo navesti neke od njih.

Funkcije za pretragu u stringu

Funkcija find se može koristiti za pretragu pozicije karaktera u stringu, ili za poziciju podstringa. Na primer, možemo da nađemo poziciju prvog razmaka u stringu na sledeći način:

pozicija = str.find(' ');

Ukoliko string ne sadrži nijedan znak razmaka, rezultat koji vraća funkcija find će biti jednaka vrednosti string::npos (specijalna vrednost koja označava da nije pozicija u pitanju od eng. non-position). U primeru koji sledi pokazujemo kako se string::npos može kombinovati sa funkcijom find:

if (str.find(' ') != string::npos)
{
    cout  << "String sadrzi barem jedan razmak!" << endl;
}
else
{
    cout  << "String ne sadrzi nijedan razmak!" << endl;
}

Funkcija find vraća poziciju prvog pojavljivanja datog karaktera (ili ako tog karaktera nema u stringu vratiće vrednost string::npos). Takođe postoji i slična funkcija rfind (eng. reverse, pretraga od pozadi). Funkcija rfind nalazi poziciju poslednje pojave datog karaktera, ili vrednost string::npos.

Funkcije find i rfind se mogu koristiti i za pronalaženje podstringa; sledeći fragment programskog koda se može iskoristiti da se utvrdi da li dati string sadrži reč "je".

string text;
getline(cin, text);


if (text.find("je") != string::npos)
{
    // ...

Za oba slučaja pretrage (na nivou pojedinačnog karaktera ili na nivou podstringa), može se podesiti početna pozicija pretrage. U tom slučaju, funkcija find će pronaći poziciju prvog pojavljivanja traženog podstringa ili karaktera posle te početne pozicije. Funkcija rfind vraća poziciju poslednjeg pojavljivanja pre pozicije koja je navedena. Može se reći da traži prvo pojavljivanje ako se krećemo od zadate pozicije ka nultoj poziciji stringa (dakle krećući se unazad). Zahtev koji treba da ispuni ovaj opcioni parametar je da mora biti validna/postojeća pozicija u okviru stringa, što znači da njena vrednost mora biti između 0 i duzinaStringa−1.

Sledeći primer vrši pretragu svakog pojavljivanja stringa "macka" u datom stringu i broji koliko puta se taj podstring pojavljuje.

string ulaz;

int i = 0;

int pojavaMacke = 0;

getline(cin, ulaz, '\n');

i = ulaz.find("macka", 0);

while (i != string::npos)
{
    pojavaMacke = pojavaMacke + 1;
    i = ulaz.find("macka", i+5);
}

cout << pojavaMacke;

Podstringovi

Možemo izdvojiti deo stringa funkcijom substr. Ova funkcija ne uklanja podstring iz originalnog stringa, već kreira novi string koji sadrži određeni podstring datog originalnog stringa. Traženi podstring je određen početnom pozicijom i brojem karaktera tj. dužinom, uzimajući u obzir da je pozicija početnog karaktera stringa 0. Sledeći primer dodeljuje promenljivoj fragment* sekvencu od 5 karaktera počevši od pozicije 5 iz promenljive text:

string text = "De si brate, kako je, sta ima?";

string fragment = text.substr(5, 5);

Promenljiva fragment sadrži string "brate", dok promenljiva text ostaje nepromenjena.

Ako izostavimo drugi parametar, onda će funkcija substr vratiti podstring počevši od navedene početne pozicije pa sve do kraja stringa. Na primer, sledeći blok koda dodeljuje string "i brate?" promenljivoj podstring.

string text = "De si brate?";

string podstring = text.substr(4);

Prvi parametar mora da označava validnu/postojeću poziciju u okviru stringa (kao sto je slučaj kod funkcije find), ili će ponašanje funkcije biti nedefinisano. Drugi parametar, u kombinaciji sa prvim, može uzrokovati da se premaši dužina stringa. U tom slučaju, podstring koji se vraća, sadržaće sve karaktere od specificirane početne pozicije pa do kraja stringa, kao što je prikazano u sledećem primeru:

string text = "012345";

string fragment = text.substr(2,3); // ok

fragment = text.substr(6,2); // Nije ok (1)

fragment = text.substr(3,10); // ok (2)

(1) Ova naredba ima nedefinisano ponašanje jer se početna pozicija ne nalazi u okviru datog stringa.

(2) Vraća sve raspoložive karaktere počevši od pozicije 3. U ovom određenom slučaju, ova naredba ima isti efekat kao i naredba fragment = text.substr(3,3).

Brisanje i umetanje podstringova

Pored izdvajanja podstringova, možemo i da modifikujemo dati string tako što određeni podstring možemo da zamenimo drugim stringom, ili tako što možemo da izbrišemo ceo podstring.

Funkcija erase ima dva ulazna parametra, koja određuju podstring (to su početna pozicija i broj karaktera podstringa) koji se briše iz stringa, kao u sledećem primeru:

string text = "Ovo je test";

text.erase(0,7);

Nakon izvršavanja naredbe text.erase(0,7), string text sadrzi "test". Podstring sa početnom pozicijom 0 ('O' u "Ovo je ") i koji ima 7 karaktera (uključujući i razmake) se briše iz stringa, i string se skraćuje (dobra analogija sa ovom operacijom je korišćenje [Delete] tastera u editorima teksta).

Umesto brisanja podstringa, podstring možemo zameniti i nekim drugim stringom, kao u sledećem primeru:

string text = "Ovo je test";

text.replace(4,2,"nije");

Nakon izvršavanja naredbe text.replace(4,2,"nije"), string text sadrži "Ovo nije test". Primeti da smo podstring od dva karaktera zamenili stringom od 4 karaktera. Ovo je sve dozvoljeno. Podstring se može zameniti sa stringom proizvoljne dužine. Funkcija replace je slična insert opciji (eng. "insert mode") u tekst editorima.